/*
 * PlayScenarioPanel.cpp
 *
 *  Created on: Oct 24, 2011
 *      Author: gonzalo
 */

#include "PlayScenarioPanel.h"

PlayScenarioPanel::PlayScenarioPanel(int xPos, int yPos, Widget* parent,SpaceBattleInterface* interface) :
		ScenarioPanel(xPos, yPos,parent) {
	this->owner = interface->getOwner();

	//Read the xml and build the elements
	this->addAsteroides(interface->getAsteroides());

	if(interface->getShip() != NULL){
		this->addPlayer(interface->getShip());
	}

}

void PlayScenarioPanel::addAsteroides(std::list<Asteroide*> asteroidesList){
	std::list<Asteroide*>::iterator asteroide;

	for (asteroide = asteroidesList.begin(); asteroide != asteroidesList.end();
			++asteroide) {
		this->asteroides.push_back(*asteroide);
		//Add it to the scenarioPanel as well
		add(*asteroide);
	}
}

void PlayScenarioPanel::addPlayer(ShipStatus* shipStatus){

	//There is bug here apparently
	if(shipStatus == NULL){
		Logger::log("PlayScenarioPanel","addPlayer","ShipStatus is null!");
		return;
	}

	//Verifico que esta.
	bool found =false;

	Ship* jugador = NULL;
	std::list<Ship*>::iterator it_jugador;
	for (it_jugador = jugadores.begin(); it_jugador != jugadores.end();
			++it_jugador) {
		jugador = *it_jugador;
		if (jugador->getOwner() == shipStatus->getOwner()) {
			found = true;
			jugador->updateStatus(shipStatus);
		}
	}

	//Si no lo encontre lo agrego a la pantalla
	if (!found) {
		//TODO fijarse el tema de las coordenadas, que el server de una coordenadas random
								//para darle mas onda al tema

		Ship* newShip = new Ship(shipStatus,this);
		addPlayer(newShip);
	}

}

void PlayScenarioPanel::addPlayer(Ship* newShip) {
	//TODO remover Parche
	if (jugadores.empty()) {
		newShip->duenoesinstancialocal = true;
	}
	this->jugadores.push_back(newShip);


	this->add(newShip);
}

void PlayScenarioPanel::resolve() {

	Ship* jugador = NULL;

	std::list<Bullet*>::iterator aux;
	std::list<Bullet*>::iterator it_bullet;

	//TODO GPV, aca esta la logica para borrar las balas que murieron por tiempo
	//el todo es para verificar que quede solo aca
	for (it_bullet = bullets.begin(); it_bullet != bullets.end(); ++it_bullet) {
		aux = (it_bullet);
		if (!(*aux)->isDrawable()) {
			//eraseBullet(aux);
		}
	}

	std::list<Ship*>::iterator it_jugador;
	for (it_jugador = jugadores.begin(); it_jugador != jugadores.end();
			++it_jugador) {
		jugador = *it_jugador;
		if (jugador->isShooting()) {
			addBullet(jugador->getBulletX(), jugador->getBulletY(), jugador->getBulletAngle(),jugador->getBulletLifeTime());
		}
	}

	ScenarioPanel::resolve();
}

void PlayScenarioPanel::addBullet(int x, int y, int angle, int duracionBala) {
	Bullet* bullet = new Bullet(x, y, this, angle, duracionBala);
	bullets.push_back(bullet);

	add(bullet);
}

void PlayScenarioPanel::eraseBullet(std::list<Bullet*>::iterator bullet) {
	erase(*bullet);
	bullets.erase(bullet);
}

ShipStatus PlayScenarioPanel::getShipStatus() {
	return this->getPlayerShip()->getShipStatus();
}

Ship* PlayScenarioPanel::getPlayerShip() {
	std::list<Ship*>::iterator it_jugador;

	Ship* jugador = NULL;
	for (it_jugador = jugadores.begin(); it_jugador != jugadores.end(); ++it_jugador) {
		jugador = *it_jugador;
		if (jugador->duenoesinstancialocal){
			return jugador;
		}
	}

	return jugador;
}

void PlayScenarioPanel::handleEvent(Event event) {
	Container::handleEvent(event);
}

void PlayScenarioPanel::showOn(SDL_Surface* surface){

	Container::showOn(surface);

	// DETECTA LA COLISION
/*
	Ship* jugador = NULL;
	std::list<Ship*>::iterator it_jugador;
	for (it_jugador = jugadores.begin(); it_jugador != jugadores.end(); ++it_jugador) {
		jugador = *it_jugador;
		if (jugador->duenoesinstancialocal){

			// Recorro los asteroides para ver si hubo colision
			std::list<Asteroide*>::iterator asteroide;
			for (asteroide = asteroides.begin(); asteroide != asteroides.end();
					++asteroide) {

					// Si hay colision
					if(jugador->checkCollision(*asteroide)){
						std::cout<<"Colision!!!!!";
					}
			}

		}
	}
*/

}
